package com.example.micro.netty.server.tcpprotocal;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ReplayingDecoder;

import java.util.List;

/**
 * 实现自定义协议 解码器
 *
 * @author Code Farmer
 * @create 2021/3/8 12:03 上午
 */
public class MyMessageDecoder extends ReplayingDecoder<Void> {

    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
        System.out.println("MyMessageDecoder decode 被调用");

        //需要将得到二进制字节码 -> MessageProtocal 数据包（对象）
        int length = byteBuf.readInt();
        byte[] content = new byte[length];

        /**
         * 这行很关键，如果漏加的话，下次解码就会把报错NegativeArraySizeException
         * 因为Bytebuf中容量不够了
         */
        byteBuf.readBytes(content);

        //封装成MessageProtocol 对象，放入out，传递下一个handler业务处理
        MessageProtocal messageProtocal =
                new MessageProtocal(length, content);

        list.add(messageProtocal);

    }

}
